from abc import ABC, abstractmethod
from scrapy.utils.log import logger
import execjs
import os

class BaseParser(ABC):
    method = "GET"
    Headers = {}
    Cookies = {}

    @abstractmethod
    def parse_responce(self, responce) -> list:
        """
        解析请求
        :param responce: 接口返回数据
        :return: 解析后的数据
        """
        pass

    @abstractmethod
    def encryption_param(self, page: int) -> dict:
        """
        请求参数处理
        :param page:页码
        :return: 处理后的参数字典
        """
        pass

    def init_js_context(self, file_name):
        """初始化 JS 环境，加载 encrypt.js 中的加密函数"""
        try:
            # 获取 JS 文件路径（假设与爬虫文件同目录）
            current_dir = os.path.dirname(os.path.abspath(__file__))
            js_path = os.path.join(os.path.dirname(current_dir), f"responce_parse/{file_name}.js")
            with open(js_path, 'r', encoding='utf-8') as f:
                js_code = f.read()
            # 创建 Node.js 运行环境（需本地安装 Node.js）
            ctx = execjs.compile(js_code, cwd=os.path.dirname(js_path))  # cwd 指定 npm 依赖目录
            logger.info("JS 加密环境初始化成功")
            return ctx
        except Exception as e:
            logger.error(f"JS 加密环境初始化失败：{str(e)}")
            raise  # 初始化失败则终止爬虫